無論是在開發時或是在系統安裝第三方軟體時,你可能會在安裝說明文件上看過 pip install
、npm install
、apt-get install
、brew install
等指令,而在你輸入這些指令時,你就正在操作套件管理工具下載並安裝軟體了!套件管理工具(Package Manager)如 pip
、npm
、yarn
、apt-get
等相當常在你日常的操作中出現(你可以在這裡找到各個語言、不同使用情境的套件管理工具),他們的存在最主要是為了讓你更加方便安裝、刪除、升級原有系統或開發語言所缺少的第三方工具。以撰寫科學計算的程式為例,當你發現 Python 沒有算特徵值、特徵向量的模組而又不想要自己造輪子時,你可能會在 PyPI 這個 Python 官方第三方軟體倉儲找到 NumPy
是完全符合你的需求的,並且依照指示在終端機輸入 pip install numpy
指令後,你就可以在你的程式中呼叫 NumPy 這個套件所提供的所有函式、類別,而也許隨著時間久了,NumPy
發佈了更新的版本,你可以透過 pip install numpy --upgrade
升級並使用最新的 API,或者有天你發現更好的工具想要刪除 NumPy
,你可以用 pip uninstall numpy
刪掉它。然而 像 pip 這樣的 Python 內建套件管理工具的看似方便管理許多第三方套件,但隨著產品開發的複雜度增加,卻也慢慢出現了一些開發上不方便之處。
pip 看似方便,可以用來下載第三方套件,然而卻也有著下列的問題:
pip
時,難以得知自己使用的 pip 是哪一個版本的,必須自行查看 PATH
的優先度,並且確認該路徑下的 Python 是哪個版本。pip freeze
之後卻跳出了一堆相依且不知道哪裡來的套件,而要解除安裝時,卻無法將所有相依的套件也一並刪除掉。appdirs==1.4.4
argcomplete==1.12.0
attrs==19.3.0
black==19.10b0
click==7.1.2
pathspec==0.8.0
pipx==0.15.4.0
regex==2020.7.14
toml==0.10.1
typed-ast==1.4.1
userpath==1.4.1
requests
時,並不會知道安裝的版本為哪一版(通常是 PyPI 上最新的版本),也因此當專案要協作時,需透過 Requirements File 中寫清楚每個使用的套件版號,用來統一好大家應該要使用哪個版本來進行安裝,但相對 JS 中的 package.json
並沒有明確地將 dev 與 prod 時使用的相依套件區隔出來,並且也缺少了 Lock File 明確指出要的版本。接下來幾天將會介紹如何避免上述的問題,並且透過哪些工具將可以更方便進行 Python 套件管理。